//
//  CZUserAccountViewModel.swift
//  weibo27
//
//  Created by mac on 16/4/17.
//  Copyright © 2016年 it.cast. All rights reserved.
//

import Foundation

// 这是一个纯洁的类，没有任何的父类，所以量级更轻
class CZUserAccountViewModel {
    
    var account: CZUserAccount?
    
    //最简单的单例
    static var shareModel:CZUserAccountViewModel = CZUserAccountViewModel()
    
    /// 定义一个access_token
    var access_token: String?{
        
        if  !isOutDate{
            return account?.access_token
        }
        
        return nil
    }
    /// 判断用户登录的标记
    var userLogin:Bool{
        
        //它要满足两个要求，一个是 access_token有值，一个是没有过期
        return account?.access_token != nil && !isOutDate
    }
    
    //计算性属性类似OC中有返回值的函数
     var accountPath:String{
        
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!
        
        return (path as NSString).stringByAppendingPathComponent("account.plist")
    }
    
    
    //用户头像的地址
    var avatar_largeUrl:NSURL{
        
        return NSURL(string: account?.avatar_large ?? "")!
    }
    
    // MARK: 判断日期是否过期
    private var isOutDate:Bool{
        
        if account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending{
            
            return false
        }
        
        return true
    }
    
    // MARK: 进行解档操作
   private init(){
        //对数据进行解档，拿到用户的信息  所有子类要显示的时候，就会初始化它，这个时候取出属性对象，判断
        account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? CZUserAccount
        if isOutDate{
            
            print("账号已经过期")
            //清空账号
            account = nil

        }
        
    }
    
}

// MARK: 网络方法的封装
extension CZUserAccountViewModel{
    
    func loadUserInfo(code: String, finished:(isSuccess: Bool)->()){

        //获取accessToken
        NetTools.shareTools.loadAccessToken(code) { (result, error) -> () in
            
            if error != nil{
                
                print("获取accessToken失败")
                return
            }
            
            finished(isSuccess: false)
            
            // 任何的AnyObject数据在使用之前，就要进行强转
            self.account = CZUserAccount(dict: result as! [String: AnyObject])
            
            self.loadUserData(self.account!,finished: finished)
            
        }
        
    }
    
    // 为什么要定义这个方法，因为在闭包中是没有提示的，为了利用提示，写了一个方法
    private func loadUserData(account: CZUserAccount, finished:(isSuccess: Bool)->()){
        
        NetTools.shareTools.loadUserInfo(account.uid!) { (result, error) -> () in
            if error != nil{
                print("获取用户的数据失败")
                finished(isSuccess: false)
            }
            guard let dict = result as? [String: AnyObject] else {
                print("格式有误")
                finished(isSuccess: false)
                return
            }
            
            account.screen_name = dict["name"] as? String
            
            account.avatar_large = dict["avatar_large"] as? String
            
            //在使用这个方法之前必须实现解档和归档的问题 account已经实现
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            
            print(self.accountPath)
            
            //保存成功后通知用户  如果不写这个方法，CZOAuthView中的方法根本就不会被执行到 这一句就相当于if判断
            finished(isSuccess: true)
            
        }
    }

}














